﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using BOL;
using BLL;
using DAL;

using DevComponents.DotNetBar;
using DevComponents.DotNetBar.Metro;
using DevComponents.DotNetBar.Metro.ColorTables;


namespace QLThueMuonXe
{
    public partial class frmDatXe : Form
    {
        public Label lb;
        public bool checklbHong;
        public string madatxe;
        public List<ThongTinThueXe> lstttx;
        public int SoGioCoTheDat;
        public int SoPhutCoTheDat;
        public int SoPhutBatDauDat;
        bool thanhtoan;

        public string maNhanVien;

        public string maxe;
        public DateTime ngaydk;

        HamDungChung dc = new HamDungChung();
        FormDatVe fdv = new FormDatVe();

        public frmDatXe()
        {
            InitializeComponent();
            txtPhutThue.GotFocus += new EventHandler(this.txtPhutThue_GotFocus);
            txtGioThue.GotFocus += new EventHandler(this.txtPhutThue_GotFocus);

            txtPhutKT.GotFocus += new EventHandler(this.txtPhutKT_GotFocus);
            txtGioKT.GotFocus += new EventHandler(this.txtPhutKT_GotFocus);
        }

        private void buttonX2_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void ReadOnly(bool abc)
        {
            txtHoTen.ReadOnly = abc;
            txtSDT.ReadOnly = abc;
            txtDiaChi.ReadOnly = abc;
            txtPhutBD.ReadOnly = abc;
            txtGioThue.ReadOnly = abc;
            txtGioKT.ReadOnly = abc;
            txtPhutKT.ReadOnly = abc;
            txtPhutThue.ReadOnly = abc;
            chkHuyDatXe.Enabled = abc;            
        }

        private void frmDatXe_Load(object sender, EventArgs e)
        {
            if(SoPhutCoTheDat >= 60)
            {
                SoGioCoTheDat += 1;
                SoPhutCoTheDat = SoPhutCoTheDat - 60;
            }
            
            //MessageBox.Show("Số giờ: " + SoGioCoTheDat + " - " + SoPhutCoTheDat + " có thể đặt");
            LoadThongTin();
        }

        private void Loadthongtinchung(int sophut)
        {
            txtMaDatXe.Text = (dc.NextID(fdv.madatvelonnhat(), "TX") == "Lỗi") ? "TX00001" : dc.NextID(fdv.madatvelonnhat(), "TX");            
            txtNgayDat.Text = ngaydk.ToString("MM/dd/yyyy");
            txtGioBD.Text = lb.Text;
            txtPhutBD.Text = sophut.ToString();
            txtHangXe.Text = fdv.layhangxe(maxe);
            txtXe.Text = maxe;
            ReadOnly(false);
        }

        private void LoadThongTin()
        {
            //giờ con trống
            if (lb.BackColor == System.Drawing.Color.LightBlue)
            {
                Loadthongtinchung(0);
            }
            else
            {
                //giờ còn khúc cuối nên có thể đăng ký đc
                if (lb.BackColor == System.Drawing.Color.LightCoral && checklbHong)
                {
                    Loadthongtinchung(SoPhutBatDauDat);
                }
                else
                {
                    //giờ còn khúc đầu với cả ko còn khúc nào, hiện thông tin rồi cho hủy đặt thôi
                    if (lb.BackColor == System.Drawing.Color.LightCoral && !checklbHong || lb.BackColor == System.Drawing.Color.Red)
                    {
                        var abc = lstttx.First(l => l.matx == madatxe.Trim());
                        thanhtoan = abc.thanhtoan;
                        //if (thanhtoan)
                        //{ checkthanhtoan.Enabled = false; }
                        //else checkthanhtoan.Enabled = true;
                        TimeSpan tp = new TimeSpan(abc.sogiothue, abc.sophutthue, 0);
                        DateTime gkt = abc.ngaygiothue.Add(tp);
                        txtMaDatXe.Text = abc.matx;
                        txtNgayDat.Text = abc.ngaygiothue.ToString("MM/dd/yyyy");
                        txtHoTen.Text = abc.hotenkh;
                        txtSDT.Text = abc.sdtkh;
                        txtDiaChi.Text = abc.diachikh;
                        txtGioBD.Text = abc.ngaygiothue.Hour.ToString();
                        txtPhutBD.Text = abc.ngaygiothue.Minute.ToString();
                        txtHangXe.Text = abc.hangxe;
                        txtXe.Text = abc.maxe;
                        txtGioThue.Text = abc.sogiothue.ToString();
                        txtPhutThue.Text = abc.sophutthue.ToString();
                        txtGioKT.Text = gkt.Hour.ToString();
                        txtPhutKT.Text = gkt.Minute.ToString();
                        int gia = fdv.laygia(txtHangXe.Text, ngaydk);
                        checkthanhtoan.Checked = abc.thanhtoan;
                        txtTongTien.Text = String.Format("{0:0,0}", (int.Parse(txtGioThue.Text) * gia + int.Parse(txtPhutThue.Text) * gia / 60));
                        ReadOnly(true);
                    }
                }
            }
        }

        //tạo một cái Delegate để load lại cái formMain khi lưu thông tin thành công
        public delegate void LoadLaiForm();
        // khai báo 1 kiểu hàm delegate
        public LoadLaiForm LoadNe;   

        private void buttonX1_Click(object sender, EventArgs e)
        {
            if (lb.BackColor == System.Drawing.Color.LightBlue)
            {
                if (txtHoTen.Text == "")
                {
                    MessageBox.Show("Nhập họ tên người thuê xe.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    if (int.Parse(txtTongTien.Text.Replace(",", "")) < 0 || int.Parse(txtGioKT.Text) > 23)
                    {
                        MessageBox.Show("Thời gian nhập vào không hợp lệ, xin kiểm tra lại", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else
                    {
                        if (txtPhutBD.Text == "" || int.Parse(txtPhutBD.Text) > 59)
                            MessageBox.Show("Số phút ở thời gian bắt đầu nhập vào không hợp lệ. Giá trị 0 - 59", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        else
                        {
                            if (txtGioThue.Text == "" && txtPhutThue.Text == "")
                                MessageBox.Show("Bạn chưa nhập số giờ thuê.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            else
                            {
                                if (txtGioThue.Text == "" || txtPhutThue.Text == "")
                                {
                                    MessageBox.Show("Giờ thuê hoặc phút thuê ko đc để trống", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                }
                                else
                                {
                                    if (int.Parse(txtPhutThue.Text) > 59)
                                        MessageBox.Show("Số phút ở thời gian thuê nhập vào không hợp lệ. Giá trị 0 - 59", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                    else
                                    {
                                        if (int.Parse(txtGioThue.Text) > 23)
                                            MessageBox.Show("Số giờ ở thời gian thuê nhập vào không hợp lệ. Giá trị 1 - 23", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                        else
                                        {
                                            TimeSpan giobd = new TimeSpan(int.Parse(txtGioBD.Text), 0, 0);
                                            TimeSpan giodat = new TimeSpan(SoGioCoTheDat, SoPhutCoTheDat, 0);
                                            TimeSpan giokt = giobd + giodat;
                                            // kiểm tra giờ thuê có khả dụng hay ko
                                            giobd = new TimeSpan(int.Parse(txtGioBD.Text), int.Parse(txtPhutBD.Text), 0);
                                            giodat = new TimeSpan(int.Parse(txtGioThue.Text), int.Parse(txtPhutThue.Text), 0);

                                            if (giobd + giodat > giokt)
                                                MessageBox.Show("Bạn hãy kiểm tra lại giờ thuê xe, nó vượt quá khung thời gian còn trống. Tối đa đến: " + giokt.Hours + ":" + giokt.Minutes + "", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                            else
                                            {
                                                DateTime datetm = new DateTime(ngaydk.Year, ngaydk.Month, ngaydk.Day, int.Parse(txtGioBD.Text), int.Parse(txtPhutBD.Text), 0);
                                                fdv.ThemDatXe(txtMaDatXe.Text.Trim(), txtXe.Text.Trim(), datetm, int.Parse(txtGioThue.Text), int.Parse(txtPhutThue.Text), chkHuyDatXe.Checked, checkthanhtoan.Checked, maNhanVien, txtHoTen.Text, txtSDT.Text, txtDiaChi.Text);
                                                MessageBox.Show("Đặt thuê xe thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                                //load lại cái FormMain
                                                LoadNe();
                                                this.Close();
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                //giờ còn khúc cuối nên có thể đăng ký đc
                if (lb.BackColor == System.Drawing.Color.LightCoral && checklbHong)
                {
                    if (txtHoTen.Text == "")
                    {
                        MessageBox.Show("Nhập họ tên người thuê xe.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else
                    {
                        if (txtPhutBD.Text == "" || int.Parse(txtPhutBD.Text) > 59 || int.Parse(txtPhutBD.Text) < SoPhutBatDauDat)
                            MessageBox.Show("Số phút ở thời gian bắt đầu nhập vào không hợp lệ. Giá trị " + SoPhutBatDauDat + " - 59", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        else
                        {
                            if (txtGioThue.Text == "" && txtPhutThue.Text == "")
                                MessageBox.Show("Bạn chưa nhập số giờ thuê.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            else
                            {
                                if (txtGioThue.Text == "" || txtPhutThue.Text == "")
                                {
                                    MessageBox.Show("Giờ thuê hoặc phút thuê ko đc để trống", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                }
                                else
                                {
                                    if (int.Parse(txtPhutThue.Text) > 59)
                                        MessageBox.Show("Số phút ở thời gian thuê nhập vào không hợp lệ. Giá trị 0 - 59", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                    else
                                    {
                                        if (int.Parse(txtGioThue.Text) > 23)
                                            MessageBox.Show("Số giờ ở thời gian thuê nhập vào không hợp lệ. Giá trị 1 - 23", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                        else
                                        {
                                            TimeSpan giobd = new TimeSpan(int.Parse(txtGioBD.Text), SoPhutBatDauDat, 0);
                                            TimeSpan giodat = new TimeSpan(SoGioCoTheDat, SoPhutCoTheDat, 0);
                                            TimeSpan giokt = giobd + giodat;
                                            // kiểm tra giờ thuê có khả dụng hay ko
                                            giobd = new TimeSpan(int.Parse(txtGioBD.Text), int.Parse(txtPhutBD.Text), 0);
                                            giodat = new TimeSpan(int.Parse(txtGioThue.Text), int.Parse(txtPhutThue.Text), 0);

                                            if (giobd + giodat > giokt)
                                                MessageBox.Show("Bạn hãy kiểm tra lại giờ thuê xe, nó vượt quá khung thời gian còn trống. Tối đa đến: " + giokt.Hours + ":" + giokt.Minutes + "", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                            else
                                            {
                                                DateTime datetm = new DateTime(ngaydk.Year, ngaydk.Month, ngaydk.Day, int.Parse(txtGioBD.Text), int.Parse(txtPhutBD.Text), 0);
                                                fdv.ThemDatXe(txtMaDatXe.Text.Trim(), txtXe.Text.Trim(), datetm, int.Parse(txtGioThue.Text), int.Parse(txtPhutThue.Text), chkHuyDatXe.Checked, checkthanhtoan.Checked, maNhanVien, txtHoTen.Text, txtSDT.Text, txtDiaChi.Text);
                                                MessageBox.Show("Đặt thuê xe thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                                //load lại cái FormMain
                                                LoadNe();
                                                this.Close();
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    //giờ còn khúc đầu với cả ko còn khúc nào, hiện thông tin rồi cho hủy đặt thôi
                    if (lb.BackColor == System.Drawing.Color.LightCoral && !checklbHong || lb.BackColor == System.Drawing.Color.Red)
                    {
                        if (checkthanhtoan.Checked == thanhtoan && !chkHuyDatXe.Checked)
                        {
                            MessageBox.Show("Không có gì thay đổi!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                        else
                        {
                            if (checkthanhtoan.Checked != thanhtoan && !chkHuyDatXe.Checked)
                            {
                                fdv.ThanhToan(txtMaDatXe.Text.Trim(), checkthanhtoan.Checked);
                                MessageBox.Show("Cập nhật thanh toán thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                LoadNe();
                                this.Close();
                            }
                            else
                            {
                                if (chkHuyDatXe.Checked)
                                {
                                    if (txtlydohuy.Text == "")
                                        MessageBox.Show("Nhập lý do bạn muốn hủy", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                    else
                                    {
                                        fdv.HuyDatXe(txtMaDatXe.Text.Trim(), chkHuyDatXe.Checked, txtlydohuy.Text, maNhanVien);
                                        MessageBox.Show("Hủy đặt xe thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                        LoadNe();
                                        this.Close();
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        private void txtPhutBD_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
        }

        private void txtGioThue_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
        }

        private void txtPhutThue_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
        }

        private void txtGioThue_TextChanged(object sender, EventArgs e)
        {
            
            try
            {
                if (txtGioThue.ReadOnly == false)
                {
                    TimeSpan giobd = new TimeSpan(int.Parse(txtGioBD.Text), int.Parse(txtPhutBD.Text), 0);
                    TimeSpan giodat = new TimeSpan(int.Parse(txtGioThue.Text), int.Parse(txtPhutThue.Text), 0);
                    TimeSpan giokt = giobd + giodat;
                    txtGioKT.Text = giokt.Hours.ToString();
                    txtPhutKT.Text = giokt.Minutes.ToString();
                    int gia = fdv.laygia(txtHangXe.Text, ngaydk);
                    txtTongTien.Text = String.Format("{0:0,0}", (int.Parse(txtGioThue.Text) * gia + int.Parse(txtPhutThue.Text) * gia / 60));
                }
            }
            catch { }
        }


        private void txtPhutThue_GotFocus(object sender, EventArgs e)
        {
            this.txtPhutThue.TextChanged += new System.EventHandler(this.txtPhutThue_TextChanged);
            this.txtGioThue.TextChanged += new System.EventHandler(this.txtGioThue_TextChanged);

            this.txtPhutKT.TextChanged -= new System.EventHandler(this.txtPhutKT_TextChanged);
            this.txtGioKT.TextChanged -= new System.EventHandler(this.txtGioKT_TextChanged);
        }

        private void txtPhutKT_GotFocus(object sender, EventArgs e)
        {
            this.txtPhutThue.TextChanged -= new System.EventHandler(this.txtPhutThue_TextChanged);
            this.txtGioThue.TextChanged -= new System.EventHandler(this.txtGioThue_TextChanged);

            this.txtPhutKT.TextChanged += new System.EventHandler(this.txtPhutKT_TextChanged);
            this.txtGioKT.TextChanged += new System.EventHandler(this.txtGioKT_TextChanged);
        }

    
        private void txtPhutThue_TextChanged(object sender, EventArgs e)
        {
            if (txtPhutThue.Text != "" && int.Parse(txtPhutThue.Text) > 59)
            {
                MessageBox.Show("Số phút nhập vào không hợp lệ. Giá trị 0 - 59", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtPhutThue.Text = "0";
            }
            else
            {
                try
                {
                    TimeSpan giobd = new TimeSpan(int.Parse(txtGioBD.Text), int.Parse(txtPhutBD.Text), 0);
                    if (txtGioThue.ReadOnly == false)
                    {
                        TimeSpan giodat = new TimeSpan(int.Parse(txtGioThue.Text), int.Parse(txtPhutThue.Text), 0);
                        TimeSpan giokt = giobd + giodat;
                        txtGioKT.Text = giokt.Hours.ToString();
                        txtPhutKT.Text = giokt.Minutes.ToString();
                        int gia = fdv.laygia(txtHangXe.Text, ngaydk);
                        txtTongTien.Text = String.Format("{0:0,0}", (int.Parse(txtGioThue.Text) * gia + int.Parse(txtPhutThue.Text) * gia / 60));
                    }
                }
                catch { }
            }
        }

        private void txtPhutKT_TextChanged(object sender, EventArgs e)
        {
            if (txtPhutKT.Text != "" && int.Parse(txtPhutKT.Text) > 59)
            {
                MessageBox.Show("Số phút nhập vào không hợp lệ. Giá trị 0 - 59", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtPhutKT.Text = "0";
            }
            else
            {
                try
                {
                    TimeSpan giobd = new TimeSpan(int.Parse(txtGioBD.Text), int.Parse(txtPhutBD.Text), 0);
                    if (txtGioThue.ReadOnly == false)
                    {
                        TimeSpan giokt = new TimeSpan(int.Parse(txtGioKT.Text), int.Parse(txtPhutKT.Text), 0);
                        TimeSpan giothue = giokt - giobd ;
                        txtGioThue.Text = giothue.Hours.ToString();
                        txtPhutThue.Text = giothue.Minutes.ToString();
                        int gia = fdv.laygia(txtHangXe.Text, ngaydk);
                        txtTongTien.Text = String.Format("{0:0,0}", (int.Parse(txtGioThue.Text) * gia + int.Parse(txtPhutThue.Text) * gia / 60));
                    }
                }
                catch { }
            }
        }

        private void chkHuyDatXe_CheckedChanged(object sender, EventArgs e)
        {
            txtlydohuy.Enabled = chkHuyDatXe.Checked;
        }

        private void txtPhutThue_MouseHover(object sender, EventArgs e)
        {
           // MessageBox.Show("ád");
        }

        private void txtGioKT_TextChanged(object sender, EventArgs e)
        {
            try
            {
                if (txtGioThue.ReadOnly == false)
                {
                    TimeSpan giobd = new TimeSpan(int.Parse(txtGioBD.Text), int.Parse(txtPhutBD.Text), 0);
                    TimeSpan giokt = new TimeSpan(int.Parse(txtGioKT.Text), int.Parse(txtPhutKT.Text), 0);
                    TimeSpan giothue = giokt - giobd;
                    txtGioThue.Text = giothue.Hours.ToString();
                    txtPhutThue.Text = giothue.Minutes.ToString();
                    int gia = fdv.laygia(txtHangXe.Text, ngaydk);
                    txtTongTien.Text = String.Format("{0:0,0}", (int.Parse(txtGioThue.Text) * gia + int.Parse(txtPhutThue.Text) * gia / 60));
                }
            }
            catch { }
        }
       
    }
}
